none
powershellでドキュメントライブラリのフォルダ階層をコピーしたい RRS feed

  • 質問

  • お世話になっておりますs。

    SharePointのドキュメントライブラリ内のフォルダを

    階層を保ったまま別サイトコレクションへコピーする方法をご教授いただけないでしょうか?

    中身のドキュメントについてはコピーはしません。フォルダのみのコピーとなります。

    2017年5月15日 4:41

回答

  • こんにちは。

    簡単にやる方法はなさそうなのでCSOMでプログラムを作ってみました。

        public static class Program {
    
            private static void Main(string[] args) {
                var sourceWebUrl = "<URL>";
                var sourceDocLibName = "Shared Documents";
                var sourceUserName = "<ユーザ名>";
                var sourceRawPassword = "<パスワード>";
                var sourceSecurePassword = new SecureString();
                foreach (var c in sourceRawPassword) {
                    sourceSecurePassword.AppendChar(c);
                }
                var destWebUrl = "<URL>";
                var destDocLibName = "Shared Documents";
                var destUserName = "<ユーザ名>";
                var destRawPassword = "<パスワード>";
                var destSecurePassword = new SecureString();
                foreach (var c in destRawPassword) {
                    destSecurePassword.AppendChar(c);
                }
                using (var sourceContext = new ClientContext(sourceWebUrl)) {
                    sourceContext.Credentials = new SharePointOnlineCredentials(sourceUserName, sourceSecurePassword);
                    var sourceWeb = sourceContext.Web;
                    sourceContext.Load(sourceWeb);
                    sourceContext.ExecuteQuery();
                    var sourceWebPath = sourceWeb.ServerRelativeUrl.TrimEnd('/');
                    var sourceDocLib = sourceContext.Web.GetList($"{sourceWebPath}/{sourceDocLibName}");
                    sourceContext.Load(sourceDocLib, x => x, x => x.RootFolder.ServerRelativeUrl);
                    sourceContext.ExecuteQuery();
                    var sourceDocLibPath = sourceDocLib.RootFolder.ServerRelativeUrl.TrimEnd('/');
                    var sourceQuery = new CamlQuery() {
                        ViewXml =
                            "<View Scope='RecursiveAll'>" +
                            "<Query>" +
                            "<Where>" +
                            "<Eq>" +
                            "<FieldRef Name='FSObjType'/>" +
                            "<Value Type='Integer'>1</Value>" +
                            "</Eq>" +
                            "</Where>" +
                            "</Query>" +
                            "</View>"
                    };
                    var sourceItems = sourceDocLib.GetItems(sourceQuery);
                    sourceContext.Load(sourceItems);
                    sourceContext.ExecuteQuery();
                    using (var destContext = new ClientContext(destWebUrl)) {
                        destContext.Credentials = new SharePointOnlineCredentials(destUserName, destSecurePassword);
                        var destWeb = destContext.Web;
                        destContext.Load(destWeb);
                        destContext.ExecuteQuery();
                        var destWebPath = destWeb.ServerRelativeUrl.TrimEnd('/');
                        var destDocLib = destContext.Web.GetList($"{destWebPath}/{destDocLibName}");
                        destContext.Load(destDocLib, x => x, x => x.RootFolder.ServerRelativeUrl);
                        destContext.ExecuteQuery();
                        var destDocLibPath = destDocLib.RootFolder.ServerRelativeUrl.TrimEnd('/');
                        foreach (var sourceItem in sourceItems) {
                            var folderNames = sourceItem["FileRef"].ToString()
                                .Replace(sourceDocLibPath, "")
                                .TrimStart('/')
                                .Split('/');
                            var parentFolder = destWeb.GetFolderByServerRelativeUrl(destDocLibPath);
                            destContext.Load(parentFolder);
                            destContext.ExecuteQuery();
                            for (var index = 0; index < folderNames.Length; index++) {
                                var childFolderPath = destDocLibPath + "/" + string.Join("/", folderNames.Take(index + 1));
                                var childFolder = destWeb.GetFolderByServerRelativeUrl(childFolderPath);
                                try {
                                    destContext.Load(childFolder);
                                    destContext.ExecuteQuery();
                                } catch {
                                    childFolder = parentFolder.Folders.Add(folderNames[index]);
                                    destContext.Load(childFolder);
                                    destContext.ExecuteQuery();
                                }
                                parentFolder = childFolder;
                            }
                        }
                    }
                }
            }
    
        }
    
    • 回答としてマーク kny0410 2017年5月22日 5:59
    2017年5月18日 5:24

すべての返信

  • こんにちは。

    簡単にやる方法はなさそうなのでCSOMでプログラムを作ってみました。

        public static class Program {
    
            private static void Main(string[] args) {
                var sourceWebUrl = "<URL>";
                var sourceDocLibName = "Shared Documents";
                var sourceUserName = "<ユーザ名>";
                var sourceRawPassword = "<パスワード>";
                var sourceSecurePassword = new SecureString();
                foreach (var c in sourceRawPassword) {
                    sourceSecurePassword.AppendChar(c);
                }
                var destWebUrl = "<URL>";
                var destDocLibName = "Shared Documents";
                var destUserName = "<ユーザ名>";
                var destRawPassword = "<パスワード>";
                var destSecurePassword = new SecureString();
                foreach (var c in destRawPassword) {
                    destSecurePassword.AppendChar(c);
                }
                using (var sourceContext = new ClientContext(sourceWebUrl)) {
                    sourceContext.Credentials = new SharePointOnlineCredentials(sourceUserName, sourceSecurePassword);
                    var sourceWeb = sourceContext.Web;
                    sourceContext.Load(sourceWeb);
                    sourceContext.ExecuteQuery();
                    var sourceWebPath = sourceWeb.ServerRelativeUrl.TrimEnd('/');
                    var sourceDocLib = sourceContext.Web.GetList($"{sourceWebPath}/{sourceDocLibName}");
                    sourceContext.Load(sourceDocLib, x => x, x => x.RootFolder.ServerRelativeUrl);
                    sourceContext.ExecuteQuery();
                    var sourceDocLibPath = sourceDocLib.RootFolder.ServerRelativeUrl.TrimEnd('/');
                    var sourceQuery = new CamlQuery() {
                        ViewXml =
                            "<View Scope='RecursiveAll'>" +
                            "<Query>" +
                            "<Where>" +
                            "<Eq>" +
                            "<FieldRef Name='FSObjType'/>" +
                            "<Value Type='Integer'>1</Value>" +
                            "</Eq>" +
                            "</Where>" +
                            "</Query>" +
                            "</View>"
                    };
                    var sourceItems = sourceDocLib.GetItems(sourceQuery);
                    sourceContext.Load(sourceItems);
                    sourceContext.ExecuteQuery();
                    using (var destContext = new ClientContext(destWebUrl)) {
                        destContext.Credentials = new SharePointOnlineCredentials(destUserName, destSecurePassword);
                        var destWeb = destContext.Web;
                        destContext.Load(destWeb);
                        destContext.ExecuteQuery();
                        var destWebPath = destWeb.ServerRelativeUrl.TrimEnd('/');
                        var destDocLib = destContext.Web.GetList($"{destWebPath}/{destDocLibName}");
                        destContext.Load(destDocLib, x => x, x => x.RootFolder.ServerRelativeUrl);
                        destContext.ExecuteQuery();
                        var destDocLibPath = destDocLib.RootFolder.ServerRelativeUrl.TrimEnd('/');
                        foreach (var sourceItem in sourceItems) {
                            var folderNames = sourceItem["FileRef"].ToString()
                                .Replace(sourceDocLibPath, "")
                                .TrimStart('/')
                                .Split('/');
                            var parentFolder = destWeb.GetFolderByServerRelativeUrl(destDocLibPath);
                            destContext.Load(parentFolder);
                            destContext.ExecuteQuery();
                            for (var index = 0; index < folderNames.Length; index++) {
                                var childFolderPath = destDocLibPath + "/" + string.Join("/", folderNames.Take(index + 1));
                                var childFolder = destWeb.GetFolderByServerRelativeUrl(childFolderPath);
                                try {
                                    destContext.Load(childFolder);
                                    destContext.ExecuteQuery();
                                } catch {
                                    childFolder = parentFolder.Folders.Add(folderNames[index]);
                                    destContext.Load(childFolder);
                                    destContext.ExecuteQuery();
                                }
                                parentFolder = childFolder;
                            }
                        }
                    }
                }
            }
    
        }
    
    • 回答としてマーク kny0410 2017年5月22日 5:59
    2017年5月18日 5:24
  • 返信がおそくなりました。申し訳ありません。

    ありがとうございます。

    こちらを参考にして実現できました。

    2017年5月22日 5:59